--- 模块功能：注册任务.
-- @author zhangFenghe
-- @module Tweeter.registerTask
-- @license MIT
-- @copyright zhangFenghe
-- @release 2022.05.16
module(..., package.seeall) -- 使得文件中的函数在何处都可调用
require "nvm"
require "httpTask"
require "logGenerator"

nvm.init("config.lua", true)

local regCenter, ipCenter, license, owner, type, groupId, clientId, uname, pwd, scope =
nvm.get("regCenter"), nvm.get("centerConfig")[1], nvm.get("centerConfig")[2],
    nvm.get("centerConfig")[3], nvm.get("centerConfig")[4], nvm.get("centerConfig")[5],
    nvm.get("centerConfig")[6], nvm.get("centerConfig")[7], nvm.get("centerConfig")[8],
    nvm.get("centerConfig")[9]

--[[
功能  ：注册服务接口-终端通过注册中心进行入网注册，注册成功后，终端获取groupId、clientId、uname、pwd等参数
返回值：Result 具体参数：groupId：终端分组号；clientId：客户端Id，预警发布系统唯一ID；uname：账号，用于与MQTT通讯服务；
pwd：密码，用于与MQTT通讯服务。
]]
local function registrationService()
    log.info("enter registrationService")
    local registerUrl, cert, body = ipCenter .. "/register/tm_register", nil
    body = {
            ["license"] = license,
            ["owner"] = owner,
            ["type"] = type
        }
    httpTask.postApplicationJsonData(
        registerUrl,
        cert,
        body,
        60000,
        "registerTask"
    )
end

--功能:创建注册服务任务，为入网注册的入口程序
function RegistrationServiceTask()
    if regCenter then
        log.info("groupId",groupId,"clientId",clientId,"uname",uname,"pwd",pwd)
        if ""== groupId then
            groupId = nil
        end
        if ""== clientId then
            clientId = nil
        end
        if ""== uname then
            uname = nil
        end
        if ""== pwd then
            pwd = nil
        end
        if not groupId and not clientId and not uname and not pwd then
            log.info("registrationService creat")
            sys.taskInit(registrationService)
        end
    end
end

--[[
功能  ：变更注册信息  注意：终端设备的clientId和uname参数信息不可修改。
返回值：变更注册结果，通过，不通过（原因）。
]]
function ChangeRegistrationInfoServiceTask()
    local registerUrl, cert, body, alterinfo = ipCenter .. "/register/tm_altertinfo", nil
    alterinfo = "\"groupId:" .. groupId .. ",ownerChange:" .. owner .. ",type:" .. type ..
        ",pwd:" .. pwd .. "\""
    body =
        {
            ["clientId"] = clientId,
            ["owner"] = owner,
            ["type"] = type,
            ["uname"] = uname,
            ["pwd"] = pwd,
            ["alterinfo"] = alterinfo
        }
    httpTask.postApplicationJsonData(
        registerUrl,
        cert,
        body,
        60000,
        "changeRegisterInfo"
    )
end

--[[
功能  ：暂停/恢复  action（必传）：true-暂停，false-恢复，clientId（必传）：首次注册成功后，系统分配
uname（非必传）：账号，pwd（非必传）：密码
返回值：暂停/恢复结果，通过，不通过（原因）。
]]
function PauseResumeServiceTask(action)
    local registerUrl, cert, body = ipCenter .. "/register/tm_suspend", nil
    body = {
            ["clientId"] = clientId,
            ["action"] = tostring(action),
            ["uname"] = uname,
            ["pwd"] = pwd
        }
    httpTask.postApplicationJsonData(
        registerUrl,
        cert,
        body,
        60000,
        "PauseResumeServiceTask"
    )
end

--[[
功能  ：授权撤销  Scope（必传）：可一次申请多个scope撤销申请，用逗号分隔，clientId（必传）：首次注册成功后，
系统分配，uname（非必传）：账号，pwd（非必传）：密码
返回值：暂停/恢复结果，Result：注册中心对多个授权申请做出应答，每个应答结果用逗号分隔,{results1， results2……}。
results参数如下：
Scope：申请服务名；
result：通过/不通过。
]]
function AuthorizationRevocationServiceTask()
    local registerUrl, cert, body = ipCenter .. "/register/tm_cancelAuth", nil
    body ={
            ["clientId"] = clientId,
            ["scope"] = scope,
            ["uname"] = uname,
            ["pwd"] = pwd
        }
    httpTask.postApplicationJsonData(
        registerUrl,
        cert,
        body,
        60000,
        "AuthorizationRevocationServiceTask"
    )
end

--[[
功能  ：授权申请/更新  终端需要获取发布服务的授权后，才能订阅、接收发布信息。
发布信息服务包括速报服务、烈度速报服务、预警服务、日志服务、监控服务授权等。
clientId（必传）：首次注册成功后，系统分配
uname（非必传）：账号，
pwd（非必传）：密码
scope（必传）：Scope是发布服务（包含至少一个MQTT的topic），可一次申请多个scope，用逗号分隔
返回值：授权申请/更新结果，Result:注册中心对多个授权申请做出应答，每个应答结果用逗号分隔,{results1， results2……}。
scope：申请服务名；
mqtthost：所连接到的域名;
topic：MQTT主题名；
port：连接的端口号；
]]
function AuthorizationApplicationUpdateServiceTask()
    local registerUrl, cert, body = ipCenter .. "/register/tm_authorize", nil
    body =
        {
            ["scope"] = scope,
            ["clientId"] = clientId,
            ["uname"] = uname,
            ["pwd"] = pwd
        }
    log.info("clientId",clientId,"scope",scope,"uname",uname,"pwd",pwd)
    httpTask.postApplicationJsonData(
        registerUrl,
        cert,
        body,
        60000,
        "AuthorizationApplicationUpdateServiceTask"
    )
end

--[[
功能  ：授权查询  Scope（必传）：可一次申请多个scope撤销申请，用逗号分隔，clientId（必传）：首次注册成功后，
系统分配，uname（必传）：账号，pwd（必传）：密码
返回值：授权查询结果
clientId:授权用户的clientId
Token:终端授权时生成的token
scope:授权服务名称
create_at:授权时间
Topic：主题名
mqtthost：所连接到的域名
port：MQTT服务端口
]]
function AuthorizationQueryServiceTask()
    local registerUrl, cert, body = ipCenter .. "/register/tm_getTokenInfo", nil
    body = {
            ["clientId"] = clientId,
            ["scope"] = scope,
            ["uname"] = uname,
            ["pwd"] = pwd
        }
    httpTask.postApplicationJsonData(
        registerUrl,
        cert,
        body,
        60000,
        "AuthorizationQueryServiceTask"
    )
end

--RegistrationServiceTask()
